package com.urbane.auth.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;

/**
 * Spring Security 安全配置类
 * 功能：
 *   - 关闭 Session（无状态架构）
 *   - 允许匿名访问 /auth/** 路径（登录、注册接口）
 *   - 对其他所有路径强制认证（JWT 校验由自定义过滤器处理）
 *   - 禁用 CSRF（API 不需要）
 * <p>
 * 注意：实际 JWT 校验在 Gateway 网关的 JwtAuthenticationFilter 中完成，此处仅做路径控制
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    // 基础的 Spring Security 配置参考 https://docs.springjava.cn/spring-security/reference/migration-7/configuration.html
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .csrf(AbstractHttpConfigurer::disable)                          // 禁用 CSRF（REST API 不需要）
                .sessionManagement(session -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)  // 无状态，不创建 Session
                )
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/auth/**").permitAll()           // 允许匿名访问登录/注册/刷新/登出
                        .anyRequest().authenticated()                      // 其他所有请求必须认证
                )

            // 👇 关键：启用 OAuth2 登录
            .oauth2Login(oauth2 -> oauth2
                .userInfoEndpoint(userInfo -> userInfo
                        .userService(weixinUserMappingService) // 使用自定义映射器
                )
                .successHandler((request, response, authentication) -> {
                    // ✅ 成功登录后，跳转到前端指定的回调地址（如 https://shop.urbane.io/login-success?token=xxx）
                    // 你可以在这里生成 JWT 并重定向，也可以交给前端用 Authorization Code 换 Token
                    // 推荐：前端先调用 /auth/oauth2/authorize/weixin，然后监听 window.location.href 变化
                    response.sendRedirect("https://shop.urbane.io/login-success");
                })
                .failureHandler((request, response, exception) -> {
                    response.sendRedirect("https://shop.urbane.io/login?error=auth_failed");
                })
        );

        return http.build();
    }
}
